package com.linyaonan.leetcode.easy._2129;

import java.util.StringJoiner;

/**
 * 给你一个字符串 title ，它由单个空格连接一个或多个单词组成，每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 ：
 *
 * 如果单词的长度为 1 或者 2 ，所有字母变成小写。
 * 否则，将单词首字母大写，剩余字母变成小写。
 * 请你返回 大写后 的 title 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：title = "capiTalIze tHe titLe"
 * 输出："Capitalize The Title"
 * 解释：
 * 由于所有单词的长度都至少为 3 ，将每个单词首字母大写，剩余字母变为小写。
 * 示例 2：
 *
 * 输入：title = "First leTTeR of EACH Word"
 * 输出："First Letter of Each Word"
 * 解释：
 * 单词 "of" 长度为 2 ，所以它保持完全小写。
 * 其他单词长度都至少为 3 ，所以其他单词首字母大写，剩余字母小写。
 * 示例 3：
 *
 * 输入：title = "i lOve leetcode"
 * 输出："i Love Leetcode"
 * 解释：
 * 单词 "i" 长度为 1 ，所以它保留小写。
 * 其他单词长度都至少为 3 ，所以其他单词首字母大写，剩余字母小写。
 *
 *
 * 提示：
 *
 * 1 <= title.length <= 100
 * title 由单个空格隔开的单词组成，且不含有任何前导或后缀空格。
 * 每个单词由大写和小写英文字母组成，且都是 非空 的。
 *
 * @author: Lin
 * @date: 2024/3/11
 */
public class CapitalizeTheTitle {

    public String capitalizeTitle(String title) {
        String[] split = title.split("\\s+");
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < split.length; j++) {
            String s = split[j];
            // 首字母大写
            if (s.length() > 2) {
                sb.append(upCase(s.charAt(0)));
                for (int i = 1; i < s.toCharArray().length; i++) {
                    sb.append(lowCase(s.charAt(i)));
                }
            } else {
                // 全部小写
                for (int i = 0; i < s.toCharArray().length; i++) {
                    sb.append(lowCase(s.charAt(i)));
                }
            }
            if (j != split.length - 1) {
                sb.append(" ");
            }
        }
        return sb.toString();
    }

    // 原地更换
    public String capitalizeTitle2(String title) {
        int l = 0;
        int firstIndex = 0;
        char[] tt = new char[title.length()];
        boolean preIsK = false;
        for (int i = 0; i < title.toCharArray().length; i++) {
            // 空格
            if (title.charAt(i) == ' ') {
                tt[i] = ' ';
                if (l > 2) {
                    tt[firstIndex] = upCase(title.charAt(firstIndex));
                }
                l = 0;
                preIsK = true;
            } else {
                if (preIsK) {
                    firstIndex = i;
                    preIsK= false;
                }
                tt[i] = lowCase(title.charAt(i));
                l++;
            }
        }
        // 最后一个单词
        if (l > 2) {
            tt[firstIndex] = upCase(tt[firstIndex]);
        }
        return new String(tt);
    }

    private char upCase(char org) {
        if (org >= 'a') {
            org -= 32;
        }
        return org;
    }

    private char lowCase(char org) {
        if (org <= 'Z') {
            org += 32;
        }
        return org;
    }

}
